const fs = require('fs')
const path = require('path')
const ProtoBuf = require('protobufjs')
const WebSocket = require('ws')
const WebSocketServer = WebSocket.Server
const wss = new WebSocketServer({ port: 9000 })
/* 创建TCP客户端 */
const write = (data) => {
    fs.writeFile('./test.txt', data, { 'flag': 'a' }, function (err) {
        if (err) {
            throw err;
        }
        console.log('write');
    });
}
const read = (name) => {
    return new Promise(function (resolve, reject) {
        fs.readFile(name, 'utf-8', (err, data) => {
            if (err) return reject(err)
            resolve(data)
        })
    })
    // let _data = fs.readFile(name, 'utf-8', function (err, data) {
    //     if (err) {
    //         throw err;
    //     }
    //     // console.log(data)
    //     return data
    // });
    // return _data
}
let go = false
let finish = false
let index = 2000

wss.on('connection', (ws, req) => {
    // go = false
    // // 接收客户端信息并把信息返回发送
    // ws.on('message', (message) => {
    //     const data = JSON.parse(message)
    //     // console.log(data)
    //     switch (data.type) {
    //         case 'planning':
    //             finish = true // 假定接到规划指令就完成规划
    //             break
    //         case 'go':
    //             if (finish) {
    //                 go = data.go
    //             }
    //             break
    //     }
    //     let _data
    //     if (finish) { // 判断车辆是否已经在运行
    //         _data = {
    //             time: "2019-4-29-17-53",
    //             company: "Zhihui",
    //             version: "1.0",
    //             type: "ready-status",
    //             data: ""
    //         }
    //     } else {
    //         _data = {
    //             time: "2019-4-29-17-53",
    //             company: "Zhihui",
    //             version: "1.0",
    //             type: "finish-status",
    //             data: ""
    //         }
    //     }
    //     ws.send(JSON.stringify(_data), (err) => { // send 方法的第二个参数是一个错误回调函数
    //         if (err) {
    //             console.log(`[SERVER] error: ${err}`);
    //         }
    //     })
    // })
    // let data
    // if (finish) { // 判断车辆是否已经在运行
    //     data = {
    //         time: "2019-4-29-17-53",
    //         company: "Zhihui",
    //         version: "1.0",
    //         type: "ready-status",
    //         data: ""
    //     }
    // } else {
    //     data = {
    //         time: "2019-4-29-17-53",
    //         company: "Zhihui",
    //         version: "1.0",
    //         type: "finish-status",
    //         data: ""
    //     }
    // }
    // ws.send(JSON.stringify(data), (err) => { // send 方法的第二个参数是一个错误回调函数
    //     if (err) {
    //         console.log(`[SERVER] error: ${err}`);
    //     }
    // })
})
const data = read('./PathInfo.json')
data.then((data_string) => {
    // console.log(data.Data.GlobalPath.Lanes[0].points)
    const data = JSON.parse(data_string)
    const carData = data.Data.GlobalPath.Lanes[0].points
    const length = carData.length
    const num = 100
    var int = setInterval(function f() {
        wss.clients.forEach(function each(client) {
            // console.log(index)
            // console.log('go')
            // if (index >= length - 2) {
            //     finish = false
            //     go = false
            //     index = 0
            //     // clearInterval(int)
            //     client.send(JSON.stringify({
            //         "time": "2019-4-29-17-53",
            //         "company": "Zhihui",
            //         "version": "1.0",
            //         "type": "finish-status",
            //         "data": ""
            //     }))
            //     return
            // } else {
            //     if (!go) return
            //     index++
            // }
            // if (!go) return
            const s = carData[index]
            const e = carData[index + 1]
            const l = Math.sqrt(Math.pow((s[0] - e[0]), 2) + Math.pow((s[1] - e[1]), 2))
            const x = e[0] - s[0]
            const y = e[1] - s[1]
            const cos = x / l
            const sin = y / l
            const a = Math.asin(sin)
            const Lanes = []
            for (let i = index; i < (num + index); i++) {
                if (carData[i]) {
                    Lanes.push(carData[i])
                }
            }
            const Position = carData[index]
            const randomNum = ~~(Math.random() * 10 + 20)
            // console.log(randomNum % 2)
            const Position_late = carData[index - randomNum]
            const Orientation = { x: 0, y: 0, z: Math.cos(a / 2), w: Math.sin(a / 2) }
            const points = [[
                [-5, 0, 0],
                [-8, -2, 0],
                [-6, -10, 0],
                [-2, -6, 0],
                [-5, 0, 5],
                [-8, -2, 5],
                [-6, -10, 5],
                [-2, -6, 5]
            ], [
                [0, 0, 0],
                [10, 0, 0],
                [10, 10, 0],
                [0, 10, 0],
                [0, 0, 10],
                [10, 0, 10],
                [10, 10, 10],
                [0, 10, 10]
            ], [
                [-5, 0, 0],
                [-8, -2, 0],
                [-6, -10, 0],
                [-2, -6, 0],
                [-5, 0, 5],
                [-8, -2, 5],
                [-6, -10, 5],
                [-2, -6, 5]
            ]]
            console.log(randomNum % 3);

            const objects = [{
                confidence: 2,
                text: `${(Math.random() * 10 + 60).toFixed(2)}m/s`,
                position: {
                    x: Position_late && Position_late[0],
                    y: Position_late && Position_late[1],
                    z: Position_late && Position_late[2],
                },
                points: points[randomNum % 2],
                height: 1.5,
                type: 'PEDESTRIAN',
                length: 6,
                width: 3,
                rotation: Orientation
            },
            {
                confidence: 0,
                text: `${(Math.random() * 10 + 60).toFixed(2)}m/s`,
                position: {
                    x: Position_late && Position_late[0],
                    y: Position_late && Position_late[1],
                    z: Position_late && Position_late[2],
                },
                points: points[randomNum % 3],
                height: 3,
                type: 'PEDESTRIAN',
                length: 6,
                width: 3,
                rotation: Orientation
            }
            ]
            const world = {
                "time": "2019-4-29-17-53",
                "company": "Zhihui",
                "version": "1.0",
                "type": "running-status",
                "data":
                {
                    obstacles: objects,
                    local: {
                        name: 'TRAJECTORY',
                        pathPoint: Lanes
                        // path: [
                        //     {
                        //         name: 'TRAJECTORY',
                        //         pathPoint: Lanes
                        //     }
                        // ],
                    },
                    s: s,
                    e: e,
                    Angle: a,
                    car: {
                        position: { x: Position[0], y: Position[1], z: Position[2] },
                        // position: Position,
                        // rotation: { x: Orientation[0], y: Orientation[1], z: Orientation[2], w: Orientation[3] }
                        rotation: Orientation
                    },
                    status: {
                        wheel: 0
                    }
                }
            }
            client.send(JSON.stringify(world))
        })
    }, 200)

})
wss.on('message', (message) => {
    console.log(`[CLIENT] Received: ${message}`);
})
// var int = setInterval(function f() {
//     wss.clients.forEach(function each(client) {
//         console.log(buffer)
//         // const data = {
//         //     source: 'data',
//         //     data: buffer
//         // }
//         client.send(buffer)
//         // client.send(<Buffer  >)
//     })
// }, 2000)
// ProtoBuf.load("./automsg.proto", function (err, root) {
//     if (err)
//         throw err;
//     var AwesomeMessage = root.lookupType("basicTypes.vec3f");

//     var payload = { x: 1, y: 123, z: 3 };

//     var message = AwesomeMessage.create(payload);

//     var buffer = AwesomeMessage.encode(message).finish();
//     // const buf = ProtoBuf.util.newBuffer(buffer)
//     // console.log(buf)
//     // var buffer1 = AwesomeMessage.decode(buffer)
//     var int = setInterval(function f() {
//         wss.clients.forEach(function each(client) {
//             console.log(buffer)
//             // const data = {
//             //     source: 'data',
//             //     data: buffer
//             // }
//             client.send(buffer)
//             // client.send(<Buffer  >)
//         })
//     }, 2000)
// })

